/**
 * Alipay.com Inc. Copyright (c) 2004-2018 All Rights Reserved.
 */
package com.yeyks.service;

import com.yeyks.dal.domain.AccountInfo;
import com.yeyks.dal.domain.HotelInfo;
import com.yeyks.dal.domain.RoomInfo;
import com.yeyks.dal.domain.UserInfo;
import com.yeyks.exception.PermissionInvalidException;
import com.yeyks.exception.TokenInvalidException;
import com.yeyks.model.em.AccountType;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 账户服务接口
 * @author Beacon
 * @version $Id: AccountService.java, v 0.1 2018年07月31日 16:05 Beacon Exp $
 */
public interface AccountService {

    /**
     * 由当前用户ID创建对应Token，有效期为10天（calendarInterval * calendarField)
     * @param user_id
     * @return
     * @throws Exception
     */
    String createToken(String user_id);

    /**
     * 用户ID到Token
     * @param id
     * @return
     */
    String userId2Token(Integer id);

    /**
     * Token到用户Id
     * @param token
     * @return
     */
    Integer token2UserId(String token) throws TokenInvalidException;

    /**
     * 根据Token获取user_id
     *
     * @param token
     * @return user_id
     */
    String getUserId(String token) throws TokenInvalidException;

    /**
     * 判断账户权限
     * @param id
     * @param ajax
     * @return
     */
    void getPermission(Integer id, String ajax) throws Exception;

    /**
     * 判断账户权限
     * @param token
     * @param ajax
     * @return
     */
    void getPermission(String token, String ajax) throws Exception;

    /**
     * 酒店管理员查询其对应的酒店信息
     * @param id
     * @return
     */
    HotelInfo userId2HotelInfo(Integer id);

    /**
     * 酒店管理员Token到酒店信息
     * @param token
     * @return
     */
    List<HotelInfo> searchHotelsByOperator(String token);

    /**
     * 酒店管理员ID到酒店信息
     * @param id
     * @return
     */
    List<HotelInfo> searchHotelsByOperator(Integer id);

    /**
     *
     * @param id
     * @return
     */
    List<HotelInfo> searchHotelsByAdministrator(Integer id);
    List<HotelInfo> searchHotelsByAdministrator(List<Integer> ids);
    /**
     * 酒店管理员Token到酒店信息
     * @param token
     * @return
     */
    HotelInfo searchHotelByOperator(String token);

    /**
     * 酒店管理员ID到酒店信息
     * @param id
     * @return
     */
    HotelInfo searchHotelByOperator(Integer id);

    /**
     * 判断一个酒店是否是该操作员的管辖，并返回酒店信息
     * @param token
     * @param hotelId
     * @return
     */
    HotelInfo searchHotelByOperator(String token, Integer hotelId);

    /**
     * 查询一个用户下的所有房间管辖，并返回房间信息
     * @param token
     * @return
     */
    List<RoomInfo> searchRoomByOperator(String token);
    /**
     * 判断一个房间是否是该操作员的管辖
     * @param token
     * @param roomId
     * @return
     */
    boolean roomOperator(String token, Integer roomId);

    /**
     * 判断给定的所有房间ID，是否都具有操作权限
     * @param token
     * @param ids
     * @return
     */
    boolean roomHavePermission(String token, List<Integer> ids);

    /**
     * 获得Token对应的账户类型
     * @param token
     * @return
     */
    int token2AccountType(String token) throws Exception;

    /**
     * 获得Token对应账户信息
     * @param token
     * @return
     * @throws Exception
     */
    AccountInfo token2AccountInfo(String token) throws Exception;

    /**
     * 获得Token对应用户信息
     * @param token
     * @return
     */
    UserInfo tokenUserInfo(String token);

    UserInfo tokenUserInfoNoException(String token);

    /**
     * 获得Token对应账户信息
     * @param token
     * @return
     */
    AccountInfo token2AccountInfoV2(String token);

    /**
     * 设置抽成比例
     * @param admin
     * @param branch
     * @param city
     * @return
     */
    void setPrecentage(Integer admin, Integer branch, Integer city) throws Exception;

    /**
     * 获取抽成比例
     * @return
     */
    Map getPrecentage();

    /**
     * 获得子账户
     * @param id
     * @return
     */
    List<AccountInfo> getChildAccounts(Integer id);
    List<AccountInfo> getChildAccountsV2(List<Integer> ids);

    /**
     * 市代理查询城市运营商
     * @param valid  是否有效(默认有效)
     * @param area  省名称
     * @param keyword   关键字
     * @param pageNum   当前页 （默认1）
     * @param pageSize  页码 （默认10）
     * @param operatorType  操作人类型
     * @return
     */
    Map<String,Object> cityAgentList(Boolean valid, String area, String keyword, Integer id, Integer pageNum, Integer pageSize, Integer operatorType, Integer createTime, Integer province);

    /**
     * 通过area精准查找
     * @param area
     * @param type
     * @return
     */
    AccountInfo selectAccountByArea(String area, Integer type);

    /**
     * 将type为6的（即用户）数据迁移到用户表中
     */
    void testChangeUser();

    /**
     * 查询父id
     *
     * @param id
     * @return
     */
    List<Integer> getParentId(Integer id);
}